//通过时间差实现
function throttle(handle, wait, immediate) {
  if (typeof handle !== "function")
    throw new Error("handle must be an function");
  if (typeof wait === "undefined") wait = 1000;
  //如果只传入 handle 和 immediate
  if (typeof wait === "boolean") {
    immediate = wait;
    wait = 1000;
  }
  //immediate默认为flase
  if (typeof immediate !== "boolean") immediate = false;
  //定义变量记录上一次执行的时间
  let previous = 0;
  let timer = null;
  return function proxy(...args) {
    //获取当前时间
    let now = new Date();
    let self = this;
    //如果不立即执行
    if (!immediate) previous = now;
    // 计算间隔时间
    let interval = wait - (now - previous);
    if (interval <= 0) {
      // 此刻就说明是一个非高频次操作,可以执行操作
      clearTimeout(timer);
      timer = null;
      handle.apply(self, args);
      previous = new Date();
    } else if (!timer) {
      //当我们发现系统中有一个定时器了，就意味着我们不需要再开定时器
      //此刻就说明这次的操作发生了在我们定义的频次时间范围内，那就不应该执行handle
      // 这个时候我们就可以自定义一个定时器，让handle在interval之后去执行
      timer = setTimeout(() => {
        clearTimeout(timer); //清除定时器
        timer = null;
        handle.apply(self, args);
        previous = new Date();
      }, interval);
    }
  };
}

export default throttle;
